#pragma once

#include"Common.hpp"


class Init
{
public:
	Init()
	{
		umask(0);
		int n = ::mkfifo(gpipefile.c_str(),gmode); 
		if(n < 0)
		{
			std::cerr << "mkfifo error" << std::endl;
			return;
		}
		std::cout << "mkfifo success" << std::endl;
	}
	~Init()
	{
		int n = ::unlink(gpipefile.c_str());
		if(n < 0)
		{
			std::cerr << "unlink error" << std::endl;
			return ;
		}
		std::cout << "unlink sucess" << std::endl;
	}
};

Init init;


class Server
{
public:
	Server():_fd(gdefault_fd) 
	{}
	bool OpenPipeForRead()
	{
		_fd = OpenPipe(gForRead);
		if(_fd < 0) return false;
		return true;
	}
	// std::string * 输出型参数
	// const std::string & 输入型参数
	// std::string & 输入输出型参数
	int RecvPipe(std::string *out)
	{
		char buffer[gsize];
		ssize_t n = ::read(_fd,buffer,sizeof(buffer)-1);
		if(n > 0)
		{
			buffer[n] = 0;
			*out = buffer;
		}
		return n;
	}

	void ClosePipe()
	{
		ClosePipeHelper(_fd); 
	}
	
	~Server()
	{}
private:
	int _fd;
};